import org.junit.Test;

/**
 * @author cino
 * justCode
 */
public class abstractTest {

    // 抽象类和抽象方法需要被 abstract 关键字修饰
    abstract class Shape {
        // 抽象类中的方法一般要求都是抽象方法，抽象方法没有方法体
        abstract void draw();
    }
    // 当一个普通类继承一个抽象类后，这个普通类必须重写抽象类中的方法
    class Cycle extends Shape {
        @Override
        void draw() {

        }
        // @Override
        // void draw() {  // 重写抽象类中的draw方法
        //     System.out.println("画一个圆圈");
        // }
    }

    @Test
        public void test(){
            //Shape shape = new Shape();  抽象类虽然不能直接实例化
            // 但可以把一个普通类对象传给一个抽象类的引用呀，即父类引用指向子类对象
            Shape shape = new Cycle(); // 这称作：向上转型

        /*Cycle cycle = new Cycle();
          Shape shape = cycle // 这是向上转型的另一种写法
         */
            shape.draw();         // 通过父类引用调用被子类重写的方法
        }
}
